{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#     第二周机器学习作业\n",
    "皮马印第安人糖尿病分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\ProgramData\\Anaconda2\\envs\\python3\\lib\\site-packages\\sklearn\\cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "#数据导入的基本工具\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "#显示的基本工具\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "\n",
    "#模型评估基本工具\n",
    "from sklearn.metrics import log_loss\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "from sklearn.cross_validation import cross_val_score \n",
    "\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "#导入基本的数据模型\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.linear_model import LogisticRegressionCV\n",
    "\n",
    "#svm模型\n",
    "from sklearn.svm import LinearSVC\n",
    "from sklearn.svm import SVC\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 一、导入数据\n",
    "\n",
    "查看数据是否存在空值，以及基本的数字特征，最大最小值、标准差"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null int64\n",
      "BloodPressure               768 non-null int64\n",
      "SkinThickness               768 non-null int64\n",
      "Insulin                     768 non-null int64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv(\"diabetes.csv\")\n",
    "data.info()\n",
    "data.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 二、将数据做随机切分，分成测试数据和训练数据,   数据特征处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据生物常识，人的血压和皮肤层厚度，胰岛素含量不可能为0，因此将这三列中为0数据用均值进行取代，以提高准确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
      "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
      "mean      3.845052  120.894531      72.254807      26.606479  118.660163   \n",
      "std       3.369578   31.972618      12.115932       9.631241   93.080358   \n",
      "min       0.000000    0.000000      24.000000       7.000000   14.000000   \n",
      "25%       1.000000   99.000000      64.000000      20.536458   79.799479   \n",
      "50%       3.000000  117.000000      72.000000      23.000000   79.799479   \n",
      "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
      "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
      "\n",
      "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
      "count  768.000000                768.000000  768.000000  768.000000  \n",
      "mean    31.992578                  0.471876   33.240885    0.348958  \n",
      "std      7.884160                  0.331329   11.760232    0.476951  \n",
      "min      0.000000                  0.078000   21.000000    0.000000  \n",
      "25%     27.300000                  0.243750   24.000000    0.000000  \n",
      "50%     32.000000                  0.372500   29.000000    0.000000  \n",
      "75%     36.600000                  0.626250   41.000000    1.000000  \n",
      "max     67.100000                  2.420000   81.000000    1.000000  \n",
      "分割后的数据集合：\n",
      "========================= (614, 8) (614,)\n",
      "========================= (154, 8) (154,)\n"
     ]
    }
   ],
   "source": [
    "#对列数据进行变换\n",
    "data['BloodPressure'] = data['BloodPressure'].replace(0, data['BloodPressure'].mean())\n",
    "data['SkinThickness'] = data['SkinThickness'].replace(0, data['SkinThickness'].mean())\n",
    "data['Insulin'] = data['Insulin'].replace(0, data['Insulin'].mean())\n",
    "print(data.describe())\n",
    "\n",
    "#生成训练集和测试集数据\n",
    "datax = data.drop(['Outcome'], axis=1)\n",
    "datay = data['Outcome']\n",
    "X_train, X_test, y_train, y_test = train_test_split(datax, datay, test_size=0.2, random_state=42)\n",
    "print(\"分割后的数据集合：\")\n",
    "print(\"=========================\",X_train.shape, y_train.shape)\n",
    "print(\"=========================\",X_test.shape, y_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 三、数据探索\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据预处理\n",
    "因为数据单位不同，将数据正则化，提升准确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "standard = StandardScaler()\n",
    "\n",
    "X_train = standard.fit_transform(X_train)\n",
    "X_test = standard.fit_transform(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 四、模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "======= [-0.50660494 -0.47811056 -0.49150594 -0.4970057  -0.46634421]\n",
      "======= -0.4879142678891026\n"
     ]
    }
   ],
   "source": [
    "lr = LogisticRegression()\n",
    "loss = cross_val_score(lr, X_train, y_train, cv=5, scoring='neg_log_loss')\n",
    "\n",
    "print(\"=======\", loss)\n",
    "print(\"=======\", loss.mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-0.48752104078980235\n",
      "{'penalty': 'l1', 'C': 1}\n"
     ]
    }
   ],
   "source": [
    "penaltys = ['l1','l2']\n",
    "cs =  [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "parameters = dict(penalty=penaltys, C=cs)\n",
    "\n",
    "lr_penalty = LogisticRegression()\n",
    "grid= GridSearchCV(lr_penalty, parameters, cv=5, scoring='neg_log_loss')\n",
    "grid.fit(X_train,y_train)\n",
    "\n",
    "print(grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x214281137b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    pyplot.errorbar(x_axis, test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    pyplot.errorbar(x_axis, train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'neg-logloss' )\n",
    "pyplot.savefig('LogisticGridSearchCV_C.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据上图，发现当c为1时，正则为L1正则时，测试数据集有较好的结果"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 五、根据GridSearchCV计算出最优解为c=1  penalty=l1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### L1正则"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{1: array([[-0.67857985, -0.51469185, -0.50596109, -0.50638445, -0.50649273,\n",
       "         -0.50648768],\n",
       "        [-0.68691493, -0.47594604, -0.47725781, -0.47882709, -0.47901305,\n",
       "         -0.47902549],\n",
       "        [-0.68385422, -0.49030842, -0.49108669, -0.4920494 , -0.49216112,\n",
       "         -0.49217387],\n",
       "        [-0.67915238, -0.50225024, -0.49743523, -0.4976265 , -0.49766459,\n",
       "         -0.49766582],\n",
       "        [-0.68330238, -0.47091796, -0.46562166, -0.46623391, -0.46631455,\n",
       "         -0.46632526]])}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Cs = [0.01, 0.1,1,10,100, 1000]\n",
    "\n",
    "lrcv_L1 = LogisticRegressionCV(Cs=Cs, cv = 5, scoring='neg_log_loss', penalty='l1', solver='liblinear', multi_class='ovr')\n",
    "lrcv_L1.fit(X_train, y_train)   \n",
    "lrcv_L1.scores_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "C is: [1.]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[ 0.19751212,  1.04314807, -0.12202562,  0.01872478, -0.1411688 ,\n",
       "         0.74074609,  0.21353396,  0.412265  ]])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print ('C is:',lrcv_L1.C_)  \n",
    "lrcv_L1.coef_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 六、线性SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(154,)\n",
      "Classification report for classifier LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
      "     verbose=0):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.80      0.86      0.83        99\n",
      "          1       0.71      0.62      0.66        55\n",
      "\n",
      "avg / total       0.77      0.77      0.77       154\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[85 14]\n",
      " [21 34]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import classification_report\n",
    "\n",
    "linears = LinearSVC()\n",
    "lsvc = linears.fit(X_train, y_train)\n",
    "\n",
    "y_test_predict = lsvc.predict(X_test)\n",
    "print(y_test_predict.shape)\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (lsvc, classification_report(y_test, y_test_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % confusion_matrix(y_test, y_test_predict))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.7142857142857143\n",
      "accuracy: 0.7792207792207793\n",
      "accuracy: 0.7792207792207793\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.7922077922077922\n",
      "accuracy: 0.6753246753246753\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\ProgramData\\Anaconda2\\envs\\python3\\lib\\site-packages\\matplotlib\\axes\\_axes.py:545: UserWarning: No labelled objects found. Use label='...' kwarg on individual plots.\n",
      "  warnings.warn(\"No labelled objects found. \"\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x214281c8550>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def fit_grid_point_Linear(C, P, l, X_train, y_train, X_test, y_test):\n",
    "    \n",
    "    lsvc2 =  LinearSVC(penalty = P, loss=l,C = C)\n",
    "    lsvc2 = lsvc2.fit(X_train, y_train)\n",
    "    \n",
    "    accuracy = lsvc2.score(X_test, y_test)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy\n",
    "\n",
    "\n",
    "C_s = np.logspace(-3, 3, 7)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份  \n",
    "penalty_s = ['l1','l2']\n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "        tmp = fit_grid_point_Linear(oneC, \"l2\",\"hinge\", X_train, y_train, X_test, y_test)\n",
    "        accuracy_s.append(tmp)\n",
    "\n",
    "x_axis = np.log10(C_s)\n",
    "pyplot.plot(x_axis, np.array(accuracy_s), 'b-')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('svm_sick.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线性svm回归，修改loss函数为hinge，表现比默认的squared_hinge函数好一点点。\n",
    "svm线性回归相较于logisticRegression  回归， 在分类问题中表现更好。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 七、核SVM 应用调参"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n"
     ]
    }
   ],
   "source": [
    "def fit_grid_point_RBF(C, gamma, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(X_train, y_train)\n",
    "    \n",
    "    accuracy = SVC3.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy\n",
    "\n",
    "C_s = np.logspace(-100, 50,5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-100, 50, 5)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma,  X_train, y_train, X_test, y_test)\n",
    "        accuracy_s.append(tmp)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "画出各个分布参数不同取值的概率图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "print(len(accuracy_s))\n",
    "print(len(C_s))\n",
    "print(len(gamma_s))\n",
    "\n",
    "\n",
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('rbf_svm_sick.png' )\n",
    "\n",
    "pyplot.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "正则项"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
